package com.luxsoft.siipap.em.replica.importadores;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.log4j.Logger;

import com.luxsoft.siipap.model.Sucursal;
import com.luxsoft.siipap.model.core.Cliente;
import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.model.core.Proveedor;
import com.luxsoft.siipap.model.core.Unidad;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;
import com.luxsoft.siipap.ventas.model.Cobrador;
import com.luxsoft.siipap.ventas.model.Vendedor;

/**
 * Acceso a beans de uso frecuente en los importadores 
 * 
 * @author RUBEN
 *
 */
public  class ImportadorSupport {
	
	
	
	private Set<Unidad> unidades=new HashSet<Unidad>();
	
	
	private ImportadorSupport(){
		
	}
	
	private Set<Producto> productos=new HashSet<Producto>();
	
	/**
	 * 
	 * @param clave
	 * @return
	 */
	public Producto buscarProducto(final String clave){
		if(productos.isEmpty()){
			productos.addAll(ServiceLocator2.getProductoManager().getAll());
		}
		return (Producto) CollectionUtils.find(productos, new Predicate(){
			public boolean evaluate(Object input) {
				Producto p=(Producto)input;
				return p.getClave().equals(clave.trim());
			}
		});
	}
	
	private Set<Sucursal> sucursales=new HashSet<Sucursal>();
	
	public synchronized Sucursal buscarSucursal(final int clave){
		if(sucursales.isEmpty()){
			sucursales.addAll(ServiceLocator2.getLookupManager().getSucursales());
		}
		return (Sucursal) CollectionUtils.find(sucursales, new Predicate(){
			public boolean evaluate(Object input) {
				Sucursal p=(Sucursal)input;
				return p.getClave()==clave;
			}
		});
	}
	
	
	
	public Unidad buscarUnidad(final String clave){
		if(unidades.isEmpty()){
			unidades.addAll(ServiceLocator2.getLookupManager().getAll(Unidad.class));
		}
		return (Unidad) CollectionUtils.find(unidades, new Predicate(){
			public boolean evaluate(Object input) {
				Unidad p=(Unidad)input;
				return p.getUnidad().equals(clave.trim());
			}
		});
	}
	
	final Set<Cliente> clientes=new HashSet<Cliente>();
	
	public Cliente buscarCliente(final String clave){
		if(clientes.isEmpty()){
			clientes.addAll(ServiceLocator2.getClienteManager().getAll());
			DBUtils.whereWeAre();
			System.out.println("Buffer de clientes: "+clientes.size());
		}
		Cliente c=(Cliente)CollectionUtils.find(clientes, new Predicate(){
			public boolean evaluate(Object input) {
				Cliente cc=(Cliente)input;
				return cc.getClave().equals(clave.trim());
			}
		});
		return c;
	}
	
	private static Logger logger=Logger.getLogger(ImportadorSupport.class);
	
	public Cliente agregarCliente(String clave,String nombre){
		Cliente c=new Cliente(clave,nombre);
		try {
			c=ServiceLocator2.getClienteManager().save(c);
			clientes.add(c);
			return c;
		} catch (Exception e) {
			logger.error(e);
			return null;
		}
		
		
	}
	
	public void clearClientesCache(){
		clientes.clear();
	}
	
	private List<Cobrador> cobradores;
	private List<Vendedor> vendedores;
	
	public synchronized Cobrador buscarCobrador(final int id ){
		if(cobradores==null){
			cobradores=ServiceLocator2.getUniversalDao().getAll(Cobrador.class);
		}
		return (Cobrador)CollectionUtils.find(cobradores, new Predicate(){
			public boolean evaluate(Object input) {
				Cobrador target=(Cobrador)input;
				return target.getId().intValue()==id;
			}
		});
	}
	
	public synchronized Vendedor buscarVendedor(final int id ){
		if(vendedores==null){
			vendedores=ServiceLocator2.getUniversalDao().getAll(Vendedor.class);
		}
		return (Vendedor)CollectionUtils.find(vendedores, new Predicate(){
			public boolean evaluate(Object input) {
				Vendedor target=(Vendedor)input;
				return target.getId().intValue()==id;
			}
		});
	}
	
	private static ImportadorSupport INSTANCE;
	
	public synchronized static ImportadorSupport getInstance(){
		if(INSTANCE==null)
			INSTANCE=new ImportadorSupport();
		return INSTANCE;
	}
	
	
	private List<Proveedor> proveedores;
	
	public synchronized Proveedor  buscarProveedor(final String clave ){
		if(proveedores==null){
			proveedores=ServiceLocator2.getUniversalDao().getAll(Proveedor.class);
		}
		return (Proveedor)CollectionUtils.find(proveedores, new Predicate(){
			public boolean evaluate(Object input) {
				Proveedor target=(Proveedor)input;
				return target.getClave().equals(clave);
			}
		});
	}
	
	public static void main(String[] args) {
		System.out.println(ServiceLocator2.getClienteManager().buscarClientePorClave("V010018"));
		System.out.println("Todos: "+ServiceLocator2.getClienteManager().getAll().size());
	}

}
